package com.benshou.bsoa.common.db;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;
import lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;

import java.io.Serializable;
import java.time.ZonedDateTime;

@Data
public class BaseModel implements Serializable {

    /**
     * 初始时的版本号
     */
    public static final Integer INIT_VERSION_VAL = 1;

    /**
     * 默认用户Id
     */
    public static final String DEFAULT_USER = "System";

    /**
     * 版本
     */
    @Version
    @TableField(value = "version_val")
    private Integer versionVal;

    /**
     * 逻辑删除标志
     * 枚举值参考 {@link RecordIndEnum}
     */
    @TableLogic(value = RecordIndEnum.Values.ADDED, delval = RecordIndEnum.Values.DELETED)
    @TableField(value = "record_ind")
    private String recordInd;

    /**
     * 创建人
     */
    @TableField(value = "created_by", fill = FieldFill.INSERT)
    private String createdBy;

    /**
     * 创建时间
     */
    @TableField(value = "created_time", fill = FieldFill.INSERT)
    private ZonedDateTime createdTime;

    /**
     * 更新人
     */
    @TableField(value = "updated_by", fill = FieldFill.INSERT_UPDATE)
    private String updatedBy;

    /**
     * 更新时间
     */
    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
    private ZonedDateTime updatedTime;

    /**
     * 记录状态枚举
     * 用于标识数据库记录的状态，如新增、删除等
     */
    @RequiredArgsConstructor
    @Getter
    public enum RecordIndEnum {
        /**
         * 已新增
         */
        ADDED(Values.ADDED),
        /**
         * 已删除
         */
        DELETED(Values.DELETED),
        ;

        /**
         * 记录状态值常量接口
         * 定义了所有可能的记录状态常量值
         */
        public interface Values {
            /**
             * 已新增状态的值
             */
            String ADDED = "A";
            /**
             * 已删除状态的值
             */
            String DELETED = "D";
        }

        /**
         * 枚举实例对应的实际值
         */
        @NonNull
        private final String value;
    }
}